/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tramite.bc;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.cip.esymons.general.be.Empleado;
import org.cip.esymons.tramite.adapters.ResponsableAdapter;
import org.cip.esymons.tramite.be.EnumEstadoOperacion;
import org.cip.esymons.tramite.be.Procedimiento;
import org.cip.esymons.tramite.be.ResponsableProc;

/**
 *
 * @author ChristianATE
 */
@Stateless
public class ResponsableProcFacade implements ResponsableProcFacadeLocal {

    @PersistenceContext
    private EntityManager em;

    public void create(ResponsableProc responsableProc) {
        em.persist(responsableProc);
    }

    public void edit(ResponsableProc responsableProc) {
        em.merge(responsableProc);
    }

    public void remove(ResponsableProc responsableProc) {
        em.remove(em.merge(responsableProc));
    }

    public ResponsableProc find(Object id) {
        return em.find(ResponsableProc.class, id);
    }

    public List<ResponsableProc> findAll() {
        return em.createQuery("select object(o) from ResponsableProc as o").getResultList();
    }

    public Empleado buscarDesocupado(Procedimiento proc) {
        try {
            ResponsableAdapter resTemp = null;
            List<Empleado> responsable = null;
            StringBuilder sb = new StringBuilder();
            List<ResponsableAdapter> responsables = null;
            Query q = null;
            
            sb.append(" select e from ResponsableProc r, Cargo c, CargoEmpleado ce, Empleado e");
            sb.append(" where r.fkCodigocargo=c and ce.cargo=c and ce.empleado=e and r.fkProCodigo=?1");
            sb.append(" and e.fkPerCodigopna not in (select op.fkResCodigo.fkPerCodigopna from Operacion op");
            sb.append(" where (op.opeEstado=?2 or op.opeEstado=?3) and op.fkTraCodigo.fkTrmCodigo.trmNombre<>?4 and op.fkResCodigo=e");
            sb.append(" group by op.fkResCodigo.fkPerCodigopna)");
            q = em.createQuery(sb.toString());

            q.setParameter(1, proc);
            q.setParameter(2, EnumEstadoOperacion.Iniciado);
            q.setParameter(3, EnumEstadoOperacion.recepcionado);
            q.setParameter(4, "Documento Administrativo");
            responsable = q.getResultList();

            if (responsable.size() < 1) {
                Query q1 = null;
                sb = new StringBuilder();
                sb.append(" select new org.cip.esymons.tramite.adapters.ResponsableAdapter(o.fkResCodigo, count(o.fkResCodigo)) ");
                sb.append(" from Operacion o where o.fkResCodigo.fkPerCodigopna in (select e.fkPerCodigopna");
                sb.append(" from ResponsableProc r, Cargo c, CargoEmpleado ce, Empleado e where r.fkCodigocargo=c");
                sb.append(" and ce.cargo=c and ce.empleado=e and r.fkProCodigo=?1) and (o.opeEstado=?2");
                sb.append(" or o.opeEstado=?3) and o.fkTraCodigo.fkTrmCodigo.trmNombre<>?4 group by o.fkResCodigo");
                q1 = em.createQuery(sb.toString());

                q1.setParameter(1, proc);
                q1.setParameter(2, EnumEstadoOperacion.Iniciado);
                q1.setParameter(3, EnumEstadoOperacion.recepcionado);
                q1.setParameter(4, "Documento Administrativo");
                responsables = q1.getResultList();
            } else {
                return responsable.get(0);
            }

//        if (responsables.size()<1){
//            System.out.print("nulo");
//            return (ResponsableProc) em.createQuery("select o from ResponsableProc o where o.fkProCodigo=?1 ").setParameter(1, proc).getResultList().get(0);
//        }

            for (ResponsableAdapter res : responsables) {
                if (resTemp == null) {
                    resTemp = res;
                } else if (resTemp.getCont() > res.getCont()) {
                    resTemp = res;
                }
            }
            return resTemp.getResponsable();
        } catch (Exception e) {
            return null;
        }
    }
}